using Microsoft.AspNetCore.Mvc;
using WebapiTemplate.Domain.Entity;
using Microsoft.AspNetCore.Mvc.Filters;
using WebapiTemplate.Application.Common.Interface;


/// <summary>
/// 全局异常具体实现类，需要在Program.cs类中启用
/// </summary>
namespace WebapiTemplate.Infrastructure.Filter
{
    public class HttpGlobalExceptionFilter : IAsyncExceptionFilter//继承Mvc自带的异常过滤器
    {
        //定义存放异常记录表实例字段
        private readonly IRepository<ExceptionLog> _exceptionLog;



        //依赖注入得到字段的真正表实例
        public HttpGlobalExceptionFilter(IRepository<ExceptionLog> exceptionLog)
        {
            _exceptionLog = exceptionLog;
        }

            
        //实现过滤器IAsyncExceptionFilter接口的方法
        public  Task OnExceptionAsync(ExceptionContext context)//context-获取或设置已处理的指示 Exception 
        {
            var tmpuser =
                new ExceptionLog
                    {
                         ExceptionMsg = context.Exception.Message//或者context.Exception.ToString()
                    };


            //保存进数据库        
            _exceptionLog.AddAsync(tmpuser);



            // ExceptionHandled-获取或设置一个值，该值指示是否已处理异常
            if(context.ExceptionHandled==false)
            {
                //自定义异常的返回对象
                var res = new {
                    code=1000,
                    msg="发现异常，错误信息如下：",
                    //异常的详细信息
                    error = context.Exception.Message 
                };
                


                /*
                    为什么要new ContentResult类型？因为context.Result 是抛出异常的返回值，
                    类型是Microsoft.AspNetCore.Mvc.IActionResult，而ContentResult类在
                    执行 ActionResult 时将生成包含内容的响应，且返回值恰好是IActionResult类型
                */
                context.Result = new ContentResult
                {
                    Content = res.ToString()
                };
            }
            
           
            //告诉系统异常已经被人为处理了,不需要系统再抛出自带的异常
            context.ExceptionHandled = true;
        
        
            //Task.CompletedTask本质上来说是返回一个已经完成的Task对象
            return  Task.CompletedTask;

        }
    }
}